<?php
/**
 * 封装了字符串类型
 *
 * @author lfYang
 *        
 */
class CSTRING implements IAccess {
	/**
	 *
	 * @var string
	 */
	protected $_value;
	
	/**
	 * <h2>构造函数</h2>
	 * <p>接受一个字符串参数</p>
	 *
	 * @param string $v        	
	 */
	public function __construct($v = '') {
		$this->setValue ( $v );
	}
	
	/**
	 * (non-PHPdoc)
	 *
	 * @see IAccess::getValue()
	 */
	public function getValue() {
		return strval ( $this->_value );
	}
	
	/**
	 * (non-PHPdoc)
	 *
	 * @see IAccess::setValue()
	 */
	public function setValue($v) {
		$this->_value = strval ( $v );
	}
	
	/**
	 * (non-PHPdoc)
	 *
	 * @see IAccess::__toString()
	 */
	public function __toString() {
		return strval ( $this->_value );
	}
	
	/**
	 * <h2>清理HTML标记</h2>
	 * <p>strip htm tags, then return self reference</p>
	 *
	 * @return CSTRING
	 */
	public function sanitize() {
		$s = filter_var ( $this->_value, FILTER_SANITIZE_STRING );
		return new CSTRING ( $s );
	}
	
	/**
	 * <h2>返回字符串长度</h2>
	 *
	 * @return number
	 */
	public function length() {
		return mb_strlen ( $this->_value, 'UTF-8' );
	}
	
	/**
	 * <h2>返回指定位置的字符，如果$idx超过字符的索引范围，则返回<b>null</b></h2>
	 *
	 * @param int $idx        	
	 * @return string
	 */
	public function charAt($idx) {
		if ($idx < 0 || $idx >= mb_strlen ( $this->_value, 'UTF-8' )) {
			return null;
		}
		return mb_substr ( $this->_value, $idx, 1 );
	}
	
	/**
	 * <h2>判断字符串是否匹配给定的正则表达式</h2>
	 *
	 * @param string $regexp
	 *        	用来匹配字符串的正则表达式，perl compatible正则表达式
	 * @throws ExceptionEx
	 * @return bool
	 */
	public function matches($regexp) {
		if (null == $regexp) {
			throw new ExceptionEx ( 'INVALID_PARAMETER' );
		}
		return preg_match ( $regexp, $this->_value ) > 0;
	}
	
	/*
	 * 测试对象销毁
	 */
	// public function __destruct() {
	// error_log ( 'CSTRING destruct' );
	// }
}
